package com.shijie.sjoj.service.box;

import com.shijie.sjoj.model.component.ParamsTypeFormat;
import com.shijie.sjoj.model.pojo.base.CodeType;
import com.shijie.sjoj.model.pojo.base.CompareIncorrect;
import com.shijie.sjoj.model.pojo.base.JudgedInfo;
import com.shijie.sjoj.model.utils.JsonFileUtils;

import java.util.List;
import java.util.Objects;

/**
 * 判题机接口
 *
 * @author ZSJ
 */
public interface JudgeWorker {

    /**
     * 文件数据路径前缀
     */
    String OutDirPrefix = "judges/";

    /**
     * 统一的返回结果方法接口
     *
     * @param code        代码
     * @param codeType    代码语言类型
     * @param argsType    原型入参类型
     * @param args        原型入参
     * @param outcomeType 原型结果类型
     * @param outcome     原型结果
     * @return JudgedInfo
     */
    JudgedInfo working(String code, CodeType codeType,
                       Class<?>[] argsType, List<List<?>> args,
                       Class<?> outcomeType, List<List<?>> outcome);


    /**
     * 比较结果
     *
     * @param resultType     结果类类型
     * @param originResult   存储的原型结果
     * @param compiledResult 编译的生成结果
     * @return JudgedInfo，正确则只有flag值，其他为null；错误则还有错误信息例
     */
    static JudgedInfo compare(Class<?> resultType, List<List<?>> originResult, List<List<?>> compiledResult) {
        // 初始化要比较的数据
        Object origin = null;
        Object compiled = null;
        // 开始比较
        for (int i = 0; i < originResult.size(); i++) {
            // 格式化提取比较数据
            origin = ParamsTypeFormat.argvFormat(originResult.get(i).getFirst(), resultType);
            compiled = ParamsTypeFormat.argvFormat(compiledResult.get(i).getFirst(), resultType);
            // 数组类型的比较不同，需深度比较，使用Objects.deepEquals()都能比较
            if (!Objects.deepEquals(origin, compiled)) {
                // 当结果比较错误，返回错误信息
                return JudgedInfo.of(CompareIncorrect.of(JsonFileUtils.toJson(origin), JsonFileUtils.toJson(compiled)));
            }
        }
        // 返回比较结果正确
        return JudgedInfo.of(null, null);
    }


}